/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ua.lviv.franko.matrix;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;

/**
 * 
 * @author marko
 */
public class Hash implements IRow

{

	// хэш-таблица в формате номер_ненулевой_ячейки = значение_ячейки

	protected Hashtable<Integer, Double>	hash	= new Hashtable<Integer, Double>();

	public void addValue(int num, double value) {
		if (hash.containsKey(num))
			hash.put(num, (double) hash.get(num) + value);
		else
			hash.put(num, value);
	}

	public ArrayList<Integer> getIndexes() {
		Set<Integer> keys = hash.keySet();
		// int count = keys.size();

		// indexes = new ArrayList<Integer>();
		ArrayList<Integer> values = new ArrayList<Integer>();

		for (Iterator<Integer> it = keys.iterator(); it.hasNext();) { // перевірити
																		// !!!!
			values.add((it.next()));
		}
		return values;
	}

	public double getValue(int num) {
		if (hash.containsKey(num))
			return (double) hash.get(num);
		return 0;
	}

	public ArrayList<Double> getValues() {
		Set<Integer> keys = hash.keySet();
		// int count = keys.size();

		// indexes = new ArrayList<Integer>();
		ArrayList<Double> values = new ArrayList<Double>();

		for (Iterator<Integer> it = keys.iterator(); it.hasNext();) { // перевірити
																		// !!!!
			values.add(hash.get(it.next()));
		}
		return values;
	}

	public void getValues(ArrayList<Integer> indexes, ArrayList<Double> values) {
		Set<Integer> keys = hash.keySet();
		// int count = keys.size();

		indexes = new ArrayList<Integer>();
		values = new ArrayList<Double>();

		int i = 0;

		for (Iterator<Integer> it = keys.iterator(); it.hasNext();) { // перевірити
																		// !!!!
			indexes.add(it.next());
			values.add(hash.get(indexes.get(i)));
			i++;
		}
	}

	public void getValues(int[] indexes, double[] values) {
		Set<Integer> keys = hash.keySet();
		int count = keys.size();

		indexes = new int[count];
		values = new double[count];

		int i = 0;

		for (Iterator<Integer> it = keys.iterator(); it.hasNext();) { // перевірити
																		// !!!!
			indexes[i] = it.next();
			values[i] = hash.get(indexes[i]);
			i++;
		}

	}

	public void removeCell(int pos) {
		Hashtable<Integer, Double> hashTemp = new Hashtable<Integer, Double>();
		hash.remove(pos);
		Set<Integer> keys = hash.keySet();
		for (Iterator<Integer> it = keys.iterator(); it.hasNext();) {
			int temppos = it.next();
			if (temppos > pos) {
				// double val = hash.get(temppos);
				// hash.remove(temppos);
				hashTemp.put(temppos - 1, hash.get(temppos));
			} else {
				hashTemp.put(temppos, hash.get(temppos));
			}
		}
		hash = hashTemp;
	}

	public void setValue(int num, double value) {
		// если значение 0-вое, то удаляем данную ячейку
		if (value == 0) {
			if (hash.containsKey(num))
				hash.remove(num);
			return;
		}

		// если значение не 0-вое, то перезаписываем или добавляем ячейку
		hash.put(num, value);
	}

}
